## ДОКАЗАТЕЛЬСТВО ВЫПОЛНЕНИЯ РАБОТЫ (POW)

### Назначение

Скрипт `pow16.js` определяет функцию `pow16(str)`, реализующую простейший алгоритм Proof-of-work (доказательство выполнения работы). Может использоваться как замена капчи (для предотвращения брутфорса) и в других аналогичных целях.

### Описание алгоритма

В каждой итерации вычисляется хэш `sha1` от аргумента `str` с солью `sha1(n)`, где `n = 0, 1, 2,...` до тех пор, пока 15&ndash;18-я цифры результата (всего 16 бит, отсюда и название скрипта) не станут равны `abcd`. Возвращается число `n` (количество итераций). Если за миллион итераций результат не достигнут, возвращается `undefined`:

```javascript
const pow16 = str => {
   let res = '', n = 0;
   while(res != "abcd") {
      res = sha1(sha1(n.toString()) + str).substr(15, 4);
      n++;
      if (n > 1e6) return;
   }
   return n - 1;
}
```

### Использование

На клиентской стороне функция `pow16` может быть использована, например, для вычисления контрольного числа `n` из строки логин+пароль (`str`). На серверной стороне проверяется валидность контрольного числа:

```php
if (substr(sha1(sha1($n).$str), 15, 4) != "abcd") {
   // отказываем в авторизации
}
```

### Тестирование

Среднее время выполнения этого алгоритма составляет 1 с (разброс от 50 мс до 4 с в зависимости от входной строки) в браузере Firefox 78.12.0esr из-под ОС Debian 10 (4.19.194-3 x86_64) на компьютере с процессором Intel(R) Core(TM) m3-7Y30 CPU @ 1.00GHz и оперативной памятью 4 ГБ. Такое время задержки позволяет значительно снизить эффективность брутфорса логина и пароля.
